#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#include "conf.h"

/* Define a estrutura da variável "Casa" */
typedef struct {
    char letra;
    int numero;
    bool tem_navio;
    bool revelada;
} Casa;

/* Cria a função para imprimir o tabuleiro */
void imprimirTabuleiro(Casa tabuleiro[TAM_TABULEIRO][TAM_TABULEIRO]) {
    /* Imprime o cabeçalho para o tabuleiro */ 
    printf("\n=== Batalha Naval! ===\n");
    printf("\n   A  B  C  D\n");
  
    for (int i = 0; i < TAM_TABULEIRO; i++) {
        printf("%d ", i + 1); /* Imprime 1, 2, 3, 4 em uma coluna */
        for (int j = 0; j < TAM_TABULEIRO; j++) {
            if (tabuleiro[i][j].revelada) {
                if (tabuleiro[i][j].tem_navio) {
                    printf("[*]"); /* Exibe * se a casa foi relevada e contém um navio */
                } else {
                    printf("[-]"); /* Exibe - se a casa foi revelada, mas não há navio */
                }                             
            } else {
                printf("[^]"); /* Exibe ^ se a casa não foi revelada ainda */
            }
        }
        printf("\n");
    }
    printf("\n");
}

void imprimirMenu() {
    printf("\n=== Iniciando Jogo ====\n");
    printf("\n1. Jogar novo jogo?\n\n");
    printf("2. Sair\n\n");
    printf("=======================\n\n");
    printf("Escolha uma opção: ");
}


int main() {
    int opcao;

    do {
        imprimirMenu();
        scanf("%d", &opcao);

        switch (opcao) {
            case NOVO_JOGO:
                /* Cria a variável tabuleiro */
                Casa tabuleiro[TAM_TABULEIRO][TAM_TABULEIRO];

                int vidas = NUM_VIDAS;

                /* Começa o jogo */
                while (vidas > 0) {
                    /* Deixa todas as casas do jogo vazias */
                    for (int i = 0; i < TAM_TABULEIRO; i++) {
                        for (int j = 0; j < TAM_TABULEIRO; j++) {
                            tabuleiro[i][j].letra = 'A' + j;
                            tabuleiro[i][j].numero = i + 1;
                            tabuleiro[i][j].tem_navio = false;
                            tabuleiro[i][j].revelada = false;
                        }
                    }

                    /* Adiciona um navio em alguma casa (EX. A2) */
                    tabuleiro[1][0].tem_navio = true;

                    /* Chama a variável principal do jogo */
                    imprimirTabuleiro(tabuleiro);

                    /* Declara variáveis necessárias e inicializa a variável vidas */
                    int linha;
                    int coluna;
                    char input_coluna;

                    /* Interação com o usuário para escolher uma linha */
                    printf("\nEscolha uma linha entre 1-4: ");
                    scanf("%d", &linha);

                    /* Interação com o usuário para escolher uma coluna (A-D) */
                    do {
                        printf("Escolha uma coluna (A-D): ");
                        scanf(" %c", &input_coluna); /* O espaço antes de %c ignora espaços em branco, incluindo o '\n' do último scanf */

                        /* Converte o caractere em maiúsculo usando toupper */
                        coluna = toupper(input_coluna) - 'A'; /* Ajusta para o índice do array */

                        if (coluna < 0 || coluna >= TAM_TABULEIRO) {
                            printf("Coluna inválida. Tente novamente.\n");
                        }
                    } while (coluna < 0 || coluna >= TAM_TABULEIRO);

                    linha--; /* Ajusta para o índice do array */

                    /* Revela a casa selecionada pelo jogador */
                    tabuleiro[linha][coluna].revelada = true;

                    if (tabuleiro[linha][coluna].tem_navio) {
                        printf("\nKabooom!!! Você acertou um submarino!\n");
                        imprimirTabuleiro(tabuleiro);
                        break;
                    } else {
                        vidas--;
                        printf("\nVocê errou!\nVidas restantes: %d\n", vidas);
                    }

                    if (vidas == 0) {
                        printf("Você ficou sem vidas! [GAME OVER]");
                    }
                }
                break;
                case SAIR:
                printf("Saindo...\n");
                break;

            default:
                printf("\nOpção inválida, escolha uma opção correta!\n");
                break;
        }
    } while (opcao != 2);

    return 0;
}

